/** ==================================================================================== **/
/**     				 Definizione dei servizi per il Build della mappa. 				 **/
/** ==================================================================================== **/

/**
 * NOTA:
 * 
 * "Chiamate AJAX con $http"
 * 
 *    Il servizio predefinito per effettuare chiamate AJAX in AngularJS è $http. Questo oggetto espone diversi metodi per i vari tipi di chiamate 
 *    HTTP i quali accettano come parametro l’URL da chiamare e restituiscono una promise per poter gestire la risposta del server.
 *    
 *    Esempio:
 *     
 *    	$http({
 *    		method: 'GET',
 *    		url: '/someUrl'
 *    	}).then(function successCallback(response) {
 *    		 // this callback will be called asynchronously
 *    		 // when the response is available
 *    	}, function errorCallback(response) {
 *    	     // called asynchronously if an error occurs
 *    		 // or server returns response with an error status.
 *    	});
 *    
 *    L'oggetto risposta ha queste proprietà:
 *    
 *      1. data - {string | Object} - Il corpo di risposta trasformato con le funzioni di trasformare.
 *      2. status - {number} - codice di stato HTTP della risposta.
 *      3. headers - {function ([headerName])} - funzione getter Header.
 *      4. config - {Object} - L'oggetto di configurazione che è stata usata per generare la richiesta.
 *      5. statusText - {string} - testo di stato HTTP della risposta.
 *      
 *    Un codice di stato della risposta tra 200 e 299 è considerato uno stato successo e comporterà la chiamata alla callback di successo. 
 *    Ogni codice di stato della risposta al di fuori di tale intervallo è considerato uno stato di errore e si tradurrà nella chiamata alla 
 *    callback di errore. 
 *    Inoltre, i codici di stato inferiore a -1 sono normalizzati a zero. 
 *    Un codice di errore -1 di solito significa che la richiesta è stata interrotta, ad esempio utilizzando un config.timeout. 
 *    Si noti che se la risposta è un reindirizzamento, XMLHttpRequest lo seguirà, il che significa che il risultato (successo o errore)
 *    viene determinato dal codice di stato della risposta finale.
 *    
 * "Shortcut methods"
 * 
 * Lista completa di shortcut methods:
 *   
 *   $http.get
 *   $http.head
 *   $http.post
 *   $http.put
 *   $http.delete
 *   $http.jsonp
 *   $http.patch
 * 
 * Esempi:
 * 
 *   $http.get('/someUrl', config).then(successCallback, errorCallback);
 *   $http.post('/someUrl', data, config).then(successCallback, errorCallback);
 */
BootApplication.service('olBuildService', 
		[ 'configuration', '$timeout','$rootScope','$translate', '$http', '$q', 'log', 'MapOptions', 'olMapsInst', 'olTreeInst', 'olMapService', 'DialogService', 'LoadingAppService', 'olControlService', 
		function(configuration, $timeout, $rootScope, $translate, $http, $q, log, MapOptions, olMapsInst, olTreeInst, olMapService, DialogService, LoadingAppService, olControlService) {
	
	/** 
	 * Recupero le configurazioni della mappa definite per l'identificativo profilo impostato.
	 * 
	 * @param {@link String} profiloId, identificativo del profilo
	 * @return {@link olDirectiveObj}
	 * @synchronously service
	 */
	this.getProfileMapConfiguration = function(profiloId) {
		var deferred = $q.defer();
		
		// loading ..
		//LoadingAppService.showLoader($translate.instant('Loader.buildConf'));
		if($rootScope.language == 'it')
			LoadingAppService.showLoader('Lettura configurazioni');
		else
			LoadingAppService.showLoader('Configurations reading');
		  
//		$http({
//		   method: 'GET',
//		   url: configuration.getParam("Constants").ContextPath + ol.ApplicationProperty.URL_CONFIGURAZIONI_PROFILO,
//		   params: { "idProfilo": profiloId },
//		   responseType: "json",
//		   cache: false,
//		})
//		.success(function(data, status, headers, config) {
//    	    try{
//		    	if(angular.isObject(data) && data.success && data.aaData != null && !angular.equals(data.aaData, "")) {
//		    		// convert configuration to object  
//					var aData = angular.fromJson(data.aaData);
//					
//					/**
//					 * Inizializzo Classe contenente le impostazioni di configurazione della mappa.
//					 */
//					var mapOptions = new MapOptions(aData);
//						/** Aggiungo all'oggetto l'id del profilo, servirà nel corso del build delle varie componenti della mappa **/
//						mapOptions.setProfiloId(profiloId);
//							
//					// spengo il loading
//					LoadingAppService.hideLoader();
//						
//					deferred.resolve(mapOptions, status);
//					
//		    	}else{
//		    		log.error("Configurazioni non recuperate per l'id profilo " + profiloId);
//		    		/**
//		    		 * spengo il loading
//		    		 */
//					LoadingAppService.hideLoader();
//					/**
//					 * Interrompo la procedura perchè la chiamata al serever non ha restituito risultati, apro una popup informativa dell'errore.
//					 */
//					DialogService.showErrorAlertApplication($translate.instant('Init.load.conf.error', {"profiloId":profiloId}));
//					
//					deferred.reject(data, status);
//		    	}
//    	    }catch(e){
//    	    	log.error("Build configurazioni mappa da profilo " + e, e.stack);
//    	    	/**
//	    		 * spengo il loading
//	    		 */
//    			LoadingAppService.hideLoader();
//    			/**
//    			 * E' andata in errore la procedura, apro una popup informativa dell'errore.
//    			 */
//    			DialogService.showErrorAlertApplication($translate.instant('Init.load.conf.error', {"profiloId":profiloId}));
//    			
//    			deferred.reject(data, status);
//    	    }
//		})
//		.error(function(data, status, headers, config) {
//			log.error("Configurazioni non recuperate per l'id profilo. Response error status " + status);
//			/**
//    		 * spengo il loading
//    		 */
//			LoadingAppService.hideLoader();
//			/**
//			 * E' andata in errore la chiamata al server, apro una popup informativa dell'errore.
//			 */
//			DialogService.showErrorAlertApplication($translate.instant('Init.load.conf.error', {"profiloId":profiloId}));
//			
//			deferred.reject(data, status);
//		});
		
		$timeout(function (){
			
			mapOptions = new MapOptions();
			mapOptions.profileId = 1;

			/** Identificativo dell'elemento (div) in cui disegnare la mappa **/
			mapOptions.setTargetMap("map");
			
			deferred.resolve(mapOptions, new Object());	
		}, 1000);
		
		
		return deferred.promise;
    }// close getProfileMapConfiguration
	
	/** 
	 * Costruisce la mappa dalle configurazioni fornite in ingresso.
	 * 
	 * @param {@link MapOptions} options
	 * @return {@link olMapsInst}
	 */
	this.buildMapToOptions = function(options) {
		try{		
			var olMaps = null;
					
			/**
			 * Inizializzo Classe contenente le impostazioni di configurazione della mappa.
			 */
			var mapOptions = new MapOptions(options);
							
			/** 
			 * Creare una nuova mappa con il costruttore ol.Map.
			 */
			var map2D = olMapService.createMap2D(mapOptions);
						
			if(map2D != false){
				/** 
				 * Creare la mappa 3D con il costruttore olcs.OLCesium.
				 */	
				var map3D = (mapOptions.isEnable3D()) ? olMapService.createMap3D(map2D, mapOptions) : null;
				if(map3D != false){
					/**
					 * Valorizzo l'oggetto di ritorno con l'istanza delle mappe appena create
					 */
					olMaps = new olMapsInst();
					olMaps.setMap2DInstance(map2D);
					olMaps.setMap3DInstance(map3D);
				}//
			}//
					
		}catch(e){
			log.error("Build configurazioni mappa da profilo " + e, e.stack);
			/**
			 * spengo il loading
			 */
			LoadingAppService.hideLoader();
			/**
			 * E' andata in errore la procedura, apro una popup informativa dell'errore.
			 */
			DialogService.showErrorAlertApplication($translate.instant('Init.load.maptooptions.error', {"profiloId":ol.ApplicationProperty.ID_PROFILO}));
       }
	
	   return olMaps;
	}// close buildMapToOptions

}]);
